package Model;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
*
* Finds the server with the minimum number of tasks and adds there the new
* generated task
*
* @author Dariana Lupea
*
*/
public class TaskScheduler implements Runnable {
private List<Server> servers;
private TaskGenerator taskGen;
private final static Logger LOGGER = Logger.getLogger(TaskScheduler.class.getName());
private int simulationTime;
private int currentTime;
private int noOfServers;
private double waitingAvgTime, serviceAvgTime;
private int maxNumberOfTasks, peakHour;
public TaskScheduler(int noOfServers, TaskGenerator taskGen, int simulationTime) {
this.noOfServers = noOfServers;
this.servers = new ArrayList<Server>(noOfServers);
this.taskGen = taskGen;
this.simulationTime = simulationTime;
this.currentTime = 0;
for (int i = 0; i < noOfServers; i++) {
servers.add(new Server(this.simulationTime, i));
}
maxNumberOfTasks = 0;
}
public Server getAvailableServer() {
int minTasks = 10000;
int currTasksNo;
int availableServer = 0;
for (int i = 0; i < servers.size(); i++) {
currTasksNo = (servers.get(i)).getNumberOfTasks();
if (currTasksNo < minTasks) {
minTasks = currTasksNo;
availableServer = i;
}
}
LOGGER.info("Found available server");
return servers.get(availableServer);
}
public void activateServers() {
for (int i = 0; i < noOfServers; i++) {
Thread th = new Thread(servers.get(i));
th.start();
}
}
/*
* Select the time at which the maximum number of tasks are at a given server
*/
public int getPeakHour(int time) {
for (Server s : servers) {
if (s.getNumberOfTasks() > maxNumberOfTasks) {
maxNumberOfTasks = s.getNumberOfTasks();
peakHour = time;
}
}
return peakHour;
}
@Override
public void run() {
activateServers();
Task currentTask = taskGen.generateTask();
currentTask.setArrivalTime(currentTask.getArrivalTime() + currentTime);
while (currentTime <= simulationTime) {
System.out.println("Current time: " + currentTime);
if (currentTask.getArrivalTime() == currentTime) {
Server s = getAvailableServer();
s.addTaskToServer(currentTask, currentTime);
getPeakHour(currentTime);
currentTask = taskGen.generateTask();
currentTask.setArrivalTime(currentTask.getArrivalTime() + currentTime);
}
LOGGER.info(currentTask + "Task ready to go to server...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
LOGGER.info("Thread cannot be sent to sleep...");
}
currentTime++;
}
if (currentTime > simulationTime) {
showResults();
}
}
public void showResults() {
for (Server s : servers) {
waitingAvgTime += s.getAverageWaitingTime();
serviceAvgTime += s.getAverageServiceTime();
}
waitingAvgTime /= noOfServers;
serviceAvgTime /= noOfServers;
System.out.println("The average waiting time is: " + waitingAvgTime + "\nThe average service time is: "
+ serviceAvgTime + "\nThe peak hour is: " + peakHour);
}
}